package softWareConstructPro;//coding with utf-8


public class BinaryOperation {
	private int left_op,opt,right_op;//左操作数，运算符，右操作数，操作符为int值
	public String toString() {//将整个算式整合成一个字符串对象
		String str = "";
		str+=String.format("%-4d", this.left_op);
		if(this.opt == 1) {//opt为1时，为加法算式
			str+="+  ";
		}
		else {
			str+="-  ";//opt为-1时，是减法算式
		}
		str+=String.format("%-4d", this.right_op);
		str+="= ";
		return str;
	}
	public BinaryOperation() {//默认构造函数
		this.left_op = 0;
		this.right_op = 0;
		this.opt = 1;
	}
	public BinaryOperation(int maxkey) {//输入最大限定值时的构造函数
		generateBinaryOperation(maxkey,0);
	}
	public BinaryOperation(int op1,int opt, int op2) {//自定义算式操作数，运算符构造函数
		this.left_op= op1;
		this.opt = opt;
		this.right_op = op2;
	}
	public int getLeft_op() {//取左边操作数函数
		return this.left_op;
	}
	public int getRight_op() {//右边
		return this.right_op;
	}
	public int getOpt() {//取运算符函数
		return this.opt;
	}
	public int getResult() {
		return this.left_op + this.opt*this.right_op;//opt运算符取1 或 -1 通过运算就能得出结果，不需要做判断
	}
	private boolean BinaryOperationTester(int maxkey) {//判断生成的算式和是否大于等于0小于等于100，（随机数生成时已经严格限定左右操作符在maxkey限定范围之内）
		return (left_op + opt*right_op)>=0 && (left_op + opt*right_op) <= maxkey; 
	}
	public void generateBinaryOperation(int maxkey, int flagn) {//生成算式函数，maxkey为算式元素及和的上限，下限默认为0
		if(flagn == 0) {//flagn为0指随机生成加减法
			this.opt = (int)(Math.random()*(maxkey+1))%2;//在这生成一次随机数，随机数是奇数为加法，随机数是偶数就定义为减法
			if(this.opt == 0) {
				this.opt = -1;
			}
		}
		else {//flagn明确指定1 或者 -1 生成固定加减法算式
			this.opt = flagn;
		}
		do {
			this.left_op = (int)(Math.random()*(maxkey+1));//生成左操作数，因为Math.random() 生成的浮点数在[0,1)之间，所以不会生成等于maxkey的数字，把maxkey+1则解决了这个问题 
			this.right_op = (int)(Math.random()*(maxkey+1));//生成右操作数
		}while(BinaryOperationTester(maxkey) == false);//while循环里放测试函数，函数测试返回为false则一直重复生成，直到函数返回为true为止
	}
	public void generateAdditionOperation(int maxkey) {//借用生成算法函数，直接生成加法算式
		generateBinaryOperation(maxkey, 1);
	}
	public void generateSubstractionOperation(int maxkey) {//借用生成算法函数，直接生成减法算式
		generateBinaryOperation(maxkey, -1);
	}
	public boolean equal(BinaryOperation bt) {//用来判断某个BinaryOperationi对象是不是和自己相等（左操作数，运算符，右操作数相等）
		return bt.left_op == this.left_op && this.opt == bt.opt && this.right_op == bt.right_op;
	}
	/*
	public static void main(String[] argv) {//use for test
		BinaryOperation bot = new BinaryOperation();
		bot.generateBinaryOperation(100, 0);
		System.out.println(bot);
	}*/
}
